//
//  AppDelegate.h
//  DebugDemo
//
//  Created by XFB on 2018/11/8.
//  Copyright © 2018年 ZhouCheng. All rights reserved.
//

#import <UIKit/UIKit.h>

@interface AppDelegate : UIResponder <UIApplicationDelegate>

@property (strong, nonatomic) UIWindow *window;


/*
 厚黑学
 1.人性弱点
 too many arguments to function call, expected 0, have 3  这是编译的错
 
 Build Setting--> Apple LLVM 6.0 - Preprocessing--> Enable Strict Checking of objc_msgSend Calls  改为 NO
 ---------------------
 
    支出     收入
 1  1212    1137
 2  8095    4074
 3  5096    1325
 4  2930    1607
 5  1738    472
 6  7496    6760
 7  5219    1705
 8  18144   2781
 9  13448   15727
 10 5993    1804
 11 2673    1854
 12 2238    166
 
 
 
 在Swfit中,什么时候用结构体，什么时候用类？
 
 类的做法优于结构体，还是结构体优于类
 函数式编程倾向于值类型
 面向对象编程更喜欢类
 
 Swift 类和结构体有很多不同特征
 1.类支持继承，结构体不支持
 2.类是引用类型，结构体是值类型
 
 Swift多使用结构体，除非你用继承和引用语义
 运行时,结构体在性能方面优于类，因为结构体的方法调用是静态绑定，而类的方法调用是动态实现的，这就是尽可能得使用结构体代替类的又一个好的原因
 
 
 组件化
 1.优点
    降低耦合度
    组件单独开发，单独测试
    多人协作开发
 2.缺点
    版本同步的问题
 3.组件拆分
    功能拆分(轮播器、网络框架、图片加载)
    业务拆分(登录、聊天、商城)
    基本的拆分
 
 下周开始写组件化demo 12月14号 记
 如果没有项目进展可以开发组件化 基本架构要完成
 
 
 
    Html5学习计划
 1、前端入门 HTML + CSS + JavaScript
 Html技术
    1.熟悉了解H5结构标签，标签类型
    2.H5新标签语义、属性语法
    3.H5新功能标签
    4.H5表单元素
    5.H5音视频播放
 CSS
    1.CSS盒子模型、CSSh浮动、CSS结构布局、CSS Sprite技术
    2.CSS3语法规则、CSS3选择器、背景扩展、CSS3新增盒子属性、文字属性、CSS3滤镜、混合模式
    3.CSS3键值对、CSS3转换模块、过渡模块
    4.CSS3浏览器兼容处理
    5.CSS3自定义动画模块、CSS3动画合成混搭
    6.iconFont图标文字、弹性盒子
    7.媒体查询、响应式布局、CSS3多列
    8.CSS3景深透视、3D位体构建、CSS3三维特效
 JavaScript 基础
    1.JavaScript简介ECMAScript语法基础
    2.变量 函数 条件语句 循环语句 定时器等基础语法学习
    3.DOM 和 BOM操作
    4.运算符 数组 遍历
    5.JSON语法基础 JSON数据解析
    6.JavaScript主流浏览器兼容处理
 JavaScript 进阶
    1、JavaScript运动基础 运动类型 面向对象的JavaScriptu运动框架
    2、JavaScript指针 闭包 作用域 函数节流深入剖析和运用
    3、正则表达式 表单验证
    4、AJAX技术 排序算法 递归算法
    5、JavaScript内置对象深入剖析
    6、面向对象基础 面向对象进阶
    7、装饰模式的熟悉和了解
    8、选择框架、面向对象版事件框架、面向对象版高级运动框架
 
 
 UIView 相当于 Flutter 中的什么？

 Widget = UIView
 widgets 拥有不同的生存时间，他们一直存在且保持不变，直到当他们需要被改变
 当widgets和他们的的状态被改变时，Flutter会构建一颗新的widgets树
 
 iOS中views在改变时并不会被重新创建，但是与其说views是可变的实例。不如说他们被重新绘制了一次，并且直到使用setNeedDisplay()之后才会被重新绘制
 
 StatelessWidget 正如它听起来一样，是一个没有附加状态的 widget。
 StatelessWidget 在你构建初始化后 不再进行改变 的界面时非常有用。
 
 如果你希望在发起 HTTP 请求时，依托接收到的数据动态的改变 UI，
 请使用 StatefulWidget。当 HTTP 请求结束后，通知 Flutter 框架 widget 的 State 更新了，好让系统来更新 UI。
 
 
 StatelessWight 和 StatfulWidget
 
 StatelessWight 静态不会进行改变UI
 StatfulWidget  依托数据动态改变UI
 StatefulWidget 拥有一个 State 对象存储它的状态数据
 并在widget 树重建时携带着它。因此状态不会丢失
 
 
 如果一个 widget 在它的 build 方法之外改变（例如，在运行时由于用户的操作而改变），它就是有状态的。
 如果一个 widget 在一次 build 之后永远不变，那它就是无状态的。
 但是，即便一个 widget 是有状态的，包含它的父亲 widget 也可以是无状态的，只要父 widget 本身不响应这些变化。
 /Users/xfb/Desktop/flutter
 
 
 
 线性表
 线性表是一种典型的线性结构。头结点无前驱有一个后继，尾节点无后继有一个前驱。链表只能顺序查找，定位一个元素的时间为O(N)，删除一个元素的时间为O(1)
 
 头结点无前驱 有一个后继
 尾结点无后继 有一个前驱
 链表只能顺序查找
 定位一个元素的时间复杂度 O(N)      删除一个元素的时间复杂度 O(1)
 
 1、线性表的顺序存储结构：把【线性表的结点】按逻辑顺序依次存放在一组地址连续的存储单元里。用这种方法存储的线性表简称顺序表。是一种随机存取的存储结构。顺序存储指内存地址是一块的，随机存取指访问时可以按下标随机访问，【存储和存取是不一样的】。如果是存储，则是指按顺序的，如果是存取，则是可以随机的，可以利用元素下标进行。【数组比线性表速度更快的是：原地逆序、返回中间节点、选择随机节点】。
    a> 便于线性表的构造和任意元素的访问
    b> 插入：插入新结点，之后结点后移。平均时间复杂度:O(n)
    c> 删除：删除节点，之后结点前移。平均时间复杂度:O(n)
 2、线性链表：用一组任意的存储单元来依次存放线性表的结点，这组存储单元即可以是连续的，也可以是不连续的，甚至是零散分布在内存中的任意位置上的。因此，链表中结点的逻辑次序和物理次序不一定相同。为了能正确表示结点间的逻辑关系，在存储每个结点值的同时，还必须【存储指示其后继结点的地址】。data域是数据域，用来存放结点的值。next是指针域（亦称链域），用来存放结点的直接后继的地址（或位置）。不需要事先估计存储空间大小。
  a> 单链表中每个结点的存储地址是存放在其前趋结点next域中，而开始结点无前趋，故应设头指针head指向开始结点。同时，由于最后一个结点无后继，故结点的指针域为空，即NULL。头插法建表(逆序)、尾插法建表(顺序)。增加头结点的目的是算法实现上的方便，但增大了内存开销。
        查找：只能从链表的头指针出发，顺链域next逐个结点往下搜索，直到搜索到第i个结点为止。因此，链表不是随机存取结构。
        插入：先找到表的第i-1的存储位置，然后插入。新结点先连后继，再连前驱。
        删除：首先找到ai-1的存储位置p。然后令p–>next指向ai的直接后继结点，即把ai从链上摘下。最后释放结点ai的空间.r=p->next;p->next=r->next;delete r。
        判断一个单向链表中是否存在环的最佳方法是快慢指针。
 b> 静态链表：用一维数组来实现线性链表，这种用一维数组表示的线性链表，称为静态链表。静态：体现在表的容量是一定的。（数组的大小）；链表：插入与删除同前面所述的动态链表方法相同。静态链表中指针表示的是下一元素在数组中的位置。
 c> 静态链表是用数组实现的，是顺序的存储结构，在物理地址上是连续的，而且需要预先分配大小。动态链表是用申请内存函数（C是malloc,C++是new）动态申请内存的，所以在链表的长度上没有限制。动态链表因为是动态申请内存的，所以每个节点的物理地址不连续，要通过指针来顺序访问。静态链表在插入、删除时也是通过修改指针域来实现的，与动态链表没有什么分别
 d>  循环链表：是一种头尾相接的链表。其特点是无须增加存储量，仅对表的链接方式稍作改变，即可使得表处理更加方便灵活。
    1、在单链表中，将终端结点的指针域NULL改为指向表头结点的或开始结点，就得到了单链形式的循环链表，并简单称为单循环链表。由于循环链表中没有NULL指针，故涉及遍历操作时，其终止条件就不再像非循环链表那样判断p或p—>next是否为空，而是判断它们是否等于某一指定指针，如头指针或尾指针等。
 e> 双向链表:在单链表的每个结点里再增加一个指向其直接前趋的指针域prior。这样就形成的链表中有两个方向不同的链。双链表一般由头指针唯一确定的，将头结点和尾结点链接起来构成循环链表，并称之为双向链表。设指针p指向某一结点，则双向链表结构的对称性可用下式描述：p—>prior—>next=p=p—>next—>prior。从两个方向搜索双链表，比从一个方向搜索双链表的方差要小。
        1、插入：先搞定插入节点的前驱和后继，再搞定后结点的前驱，最后搞定前结点的后继。
        2、在有序双向链表中定位删除一个元素的平均时间复杂度为O(n)
    3、可以直接删除当前指针所指向的节点。而不需要像单向链表中，删除一个元素必须找到其前驱。因此在插入数据时，单向链表和双向链表操作复杂度相同，而删除数据时，双向链表的性能优于单向链表
 
 
 
 1、一个OC对象在内存中如何布局的
 NSObject 的底层实现
 
 @interface NSObject {
    Class isa;
 }
 
 struct NSObject_IMPL {
    Class isa;
 }
 
 typedef struct objc_class *Class;
 
 
 1、一个NSObject对象占用多少内存?
    系统分配了 16 个字节给NSObject对象 ---> （通过malloc_size获得）
    单NSObject对象内部只使用8个字节的控件 （64bit环境下）---> (通过class_getInstanceSize 获得 )


 print、p 打印内存地址和对象
 po 打印对象
 读取内存
 memory write/ 数量格式字节数 内存地址
 x/数量 格式 字节数    内存地址
 x/ 3   x    w      0x10010
 
 修改内存中的值
 memory write 内存地址       数值
 memory write 0x00000010    10
 
 格式
 x 16进制
 f 浮点
 d 10进制
 
 字节大小
 b：byte 1字节, h：half word 2字节
 w：word 4字节, g：giant word 8字节
 
 
 
 
 
 
 
 
 */


@end

